#pragma once
#include "elemento.h"
#include "Pelota.h"
#include <vector>
#include "Punto.h"
#include "math.h"

#define FACTORVELOCIDAD 0.35
#define BOLASAUMENTOVELOCIDAD 5
#define AUMENTOVELOCIDAD 0.5
#define MAXIMOVELOCIDAD 1.5
#define MINIMOVELOCIDAD 0.5


class Carril : public Elemento
{
public:
	void Mover();//Mueve las pelotas del carril en un ciclo del juego 
	Carril(void);
	vector<Punto*>  getListaDePuntos();

	vector<Pelota*> GetListaDePelotas(){ return this->listaDePelotas;};
	void			setListaDePelotas(vector<Pelota*> lista){this->listaDePelotas=lista;}

	Pelota*			getPelotaAleatoria(vector<Pelota*> listaPelotasDisponibles);

	void			setPelotasDisponibles(vector<Pelota*> lista){this->listaDePelotasDisponibles=lista;}
	vector<Pelota*> getPelotasDisponibles(void){return this->listaDePelotasDisponibles;}

	void			setListaDePuntos(vector<Punto*> listaDePuntos);
	void			SetId(String valor);
	String			GetId();
	string			toString(void);
	void			Dibujar(SDL_Surface *screen);
	inline void		SetFondo(Textura *text){this->fondo = text;}
	void			CargarTextura(int resAnch);
	//Devuelve la recta por donde debe moverse la pelota en el tramo del carril
	void            Recta(Punto *pIzq, Punto *pDer, double *m, double *b);
	Pelota*			GetPrimeraPelota();
	void            Colision(Pelota* pelotaCarril,Pelota *pelotaSapo,bool Posicion);
   // bool            eliminoPelotas(Pelota* pelo, Pelota* pelotaJuntada);
	Pelota*         eliminoPelotas(Pelota* pelo);
	bool            reacomodoPelotas();

	int				getCantidadPelotas(){return this->cantidadPelotas;}
	void			setCantidadPelotas(int cantidad){this->cantidadPelotas=cantidad;};

	void			SumaCantidadPelotas(){this->cantidadPelotasEmitidas++;};

	int				getCantidadPelotasEmitidas(){return this->cantidadPelotasEmitidas;}
	void			setCantidadPelotasEmitidas(int cantidad){this->cantidadPelotasEmitidas=cantidad;};

	int				getCantidadPelotasEnCarril(){return this->listaDePelotas.size();};

	int             getPuntosCarril(){ return this->puntosCarril;};
	void            setPuntosCarril(int punt);

	int             getPuntosBonus(){ return this->puntosBonus;};
	void            setPuntosBonus(int punt){this->puntosBonus = punt ;};
	
	void			MoverInverso(Pelota* pelotaDesde);//Devuelve TRUE si reacomodo
	void			BonusRetroceso(int cantidadBolas);
	void			BonusFreno();

	void			setVelocidad(double bolasPorSegundo);
	double			getVelocidad();

	void            estadoFinal();

public:
	~Carril(void);

private:
	double			CalcularDesplazamientoX(double distancia, double pendiente);
	double			distanciaMovida;
	vector<Pelota*> listaDePelotasDisponibles;
	int             numeroPelota;
	vector<Punto*>  listaDePuntos;
	vector<Pelota*> listaDePelotas;
	void            AgregarPelota();
	int				cantidadPelotas;
	int				cantidadPelotasEmitidas;
	double			pixels;
	void			SetPixels( double cant){ this->pixels = cant;}
	double			GetPixels(){ return pixels;}
	int             puntosCarril;
	int				puntosBonus;

};



